Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


LXST/Platforms/linux/soundcard.py 0.4.7 (cdaf47c2) Text, 37.50 KB

T8b949e# Adapted from Bastian Bechtold's soundcard library, originally released
T8b949e# under the BSD 3-Clause License
T8b949e#
T8b949e# https://github.com/bastibe/SoundCard
T8b949e#
T8b949e# Copyright (c) 2016 Bastian Bechtold
T8b949e# All rights reserved.
T8b949e#
T8b949e# Redistribution and use in source and binary forms, with or without
T8b949e# modification, are permitted provided that the following conditions are
T8b949e# met:
T8b949e#
T8b949e# 1. Redistributions of source code must retain the above copyright
T8b949e# notice, this list of conditions and the following disclaimer.
T8b949e#
T8b949e# 2. Redistributions in binary form must reproduce the above copyright
T8b949e# notice, this list of conditions and the following disclaimer in the
T8b949e# documentation and/or other materials provided with the
T8b949e# distribution.
T8b949e#
T8b949e# 3. Neither the name of the copyright holder nor the names of its
T8b949e# contributors may be used to endorse or promote products derived
T8b949e# from this software without specific prior written permission.
T8b949e#
T8b949e# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
T8b949e# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
T8b949e# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
T8b949e# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
T8b949e# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
T8b949e# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
T8b949e# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
T8b949e# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
T8b949e# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
T8b949e# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
T8b949e# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
T8b949e#
T8b949e# Modifications and improvements Copyright 2025 Mark Qvist, and released
T8b949e# under the same BSD 3-Clause License.

Tff7b72import T7ee787os
Tff7b72import T7ee787atexit
Tff7b72import T7ee787collectionsT7ee787.T7ee787abc
Tff7b72import T7ee787time
Tff7b72import T7ee787re
Tff7b72import T7ee787threading
Tff7b72import T7ee787warnings
Tff7b72import T7ee787numpy
Tff7b72import T7ee787cffi

Te6edf3_ffi Tff7b72= Te6edf3cffiTff7b72.Td2a8ffFFITb4b4b4(Tb4b4b4)
Te6edf3_package_dirTb4b4b4, Te6edf3_ Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffsplitTb4b4b4(Tff7b72__file__Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3_package_dirTb4b4b4, Ta5d6ff"Ta5d6ffpulseaudio.hTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffrtTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4: Te6edf3_ffiTff7b72.Td2a8ffcdefTb4b4b4(Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)

T8b949e# Try explicit file name, if the general does not work (e.g. on nixos)
Tff7b72tryTb4b4b4: Te6edf3_pa Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffdlopenTb4b4b4(Ta5d6ff"Ta5d6ffpulseTa5d6ff"Tb4b4b4)
Tff7b72except Tf85149OSErrorTb4b4b4: Te6edf3_pa Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffdlopenTb4b4b4(Ta5d6ff"Ta5d6fflibpulse.soTa5d6ff"Tb4b4b4)
T8b949e# First, we need to define a global _PulseAudio proxy for interacting
T8b949e# with the C API:

Tff7b72def Td2a8ff_lockTb4b4b4(Te6edf3funcTb4b4b4)Tb4b4b4:
T8b949e"""Call a pulseaudio function while holding the mainloop lock."""
Tff7b72def Td2a8fffunc_with_lockTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72self Tff7b72= Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lock_mainloopTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3funcTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]Tb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72return Te6edf3func_with_lock


Tff7b72def Td2a8ff_lock_and_blockTb4b4b4(Te6edf3funcTb4b4b4)Tb4b4b4:
T8b949e"""Call a pulseaudio function while holding the mainloop lock, and
block until the operation has finished.

Use this for pulseaudio functions that return a `pa_operation *`.

"""
Tff7b72def Td2a8fffunc_with_lockTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72self Tff7b72= Te6edf3argsTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lock_mainloopTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3operation Tff7b72= Te6edf3funcTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]Tb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_block_operationTb4b4b4(Te6edf3operationTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pa_operation_unrefTb4b4b4(Te6edf3operationTb4b4b4)
Tff7b72return Te6edf3func_with_lock


Tff7b72def Td2a8ffchannel_name_mapTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""
Return a dict containing the channel position index for every channel position name string.
"""

Te6edf3channel_indices Tff7b72= Tb4b4b4{
Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_channel_position_to_stringTb4b4b4(Te6edf3idxTb4b4b4)Tb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4: Te6edf3idx Tff7b72for Te6edf3idx Tff7b72in
Tffa657rangeTb4b4b4(Te6edf3_paTff7b72.Td2a8ffPA_CHANNEL_POSITION_MAXTb4b4b4)
Tb4b4b4}

T8b949e# Append alternative names for front-left, front-right, front-center and lfe according to
T8b949e# the PulseAudio definitions.
Te6edf3channel_indicesTff7b72.Td2a8ffupdateTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffleftTa5d6ff"Tb4b4b4: Te6edf3_paTff7b72.Td2a8ffPA_CHANNEL_POSITION_LEFTTb4b4b4,
Ta5d6ff"Ta5d6ffrightTa5d6ff"Tb4b4b4: Te6edf3_paTff7b72.Td2a8ffPA_CHANNEL_POSITION_RIGHTTb4b4b4,
Ta5d6ff"Ta5d6ffcenterTa5d6ff"Tb4b4b4: Te6edf3_paTff7b72.Td2a8ffPA_CHANNEL_POSITION_CENTERTb4b4b4,
Ta5d6ff"Ta5d6ffsubwooferTa5d6ff"Tb4b4b4: Te6edf3_paTff7b72.Td2a8ffPA_CHANNEL_POSITION_SUBWOOFERTb4b4b4}Tb4b4b4)

T8b949e# The values returned from Pulseaudio contain 1 for "left", 2 for "right" and so on.
T8b949e# SoundCard"s channel indices for "left" start at 0. Therefore, we have to decrement all values.
Te6edf3channel_indices Tff7b72= Tb4b4b4{Te6edf3keyTb4b4b4: Te6edf3value Tff7b72- T79c0ff1 Tff7b72for Tb4b4b4(Te6edf3keyTb4b4b4, Te6edf3valueTb4b4b4) Tff7b72in Te6edf3channel_indicesTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4}

Tff7b72return Te6edf3channel_indices


Tff7b72class T56d364_PulseAudioTb4b4b4:
T8b949e"""Proxy for communcation with Pulseaudio.

This holds the pulseaudio main loop, and a pulseaudio context.
Together, these provide the building blocks for interacting with
pulseaudio.

This can be used to query the pulseaudio server for sources,
sinks, and server information, and provides thread-safe access to
the main pulseaudio functions.

Any function that would return a `pa_operation *` in pulseaudio
will block until the operation has finished.

"""

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# these functions are called before the mainloop starts, so we
T8b949e# don't need to hold the lock:
Tff7b72selfTff7b72.Td2a8ffmainloop Tff7b72= Te6edf3_paTff7b72.Td2a8ffpa_threaded_mainloop_newTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmainloop_api Tff7b72= Te6edf3_paTff7b72.Td2a8ffpa_threaded_mainloop_get_apiTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmainloopTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcontext Tff7b72= Te6edf3_paTff7b72.Td2a8ffpa_context_newTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmainloop_apiTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_infer_program_nameTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3_paTff7b72.Td2a8ffpa_context_connectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4, Te6edf3_paTff7b72.Td2a8ffPA_CONTEXT_NOFLAGSTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Te6edf3_paTff7b72.Td2a8ffpa_threaded_mainloop_startTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmainloopTb4b4b4)

Tff7b72while Tff7b72selfTff7b72.Td2a8ff_pa_context_get_stateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4) Tff7b72in Tb4b4b4(Te6edf3_paTff7b72.Td2a8ffPA_CONTEXT_UNCONNECTEDTb4b4b4, Te6edf3_paTff7b72.Td2a8ffPA_CONTEXT_CONNECTINGTb4b4b4, Te6edf3_paTff7b72.Td2a8ffPA_CONTEXT_AUTHORIZINGTb4b4b4, Te6edf3_paTff7b72.Td2a8ffPA_CONTEXT_SETTING_NAMETb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)
Tff7b72assert Tff7b72selfTff7b72.Td2a8ff_pa_context_get_stateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4)Tff7b72==Te6edf3_paTff7b72.Td2a8ffPA_CONTEXT_READY

Tf0883e@staticmethod
Tff7b72def Td2a8ff_infer_program_nameTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Get current progam name.

Will handle `./script.py`, `python path/to/script.py`,
`python -m module.submodule` and `python -c "code(x=y)"`.
See https://docs.python.org/3/using/cmdline.html#interface-options
"""
Tff7b72import T7ee787sys
Te6edf3prog_name Tff7b72= Te6edf3sysTff7b72.Td2a8ffargvTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72if Te6edf3prog_name Tff7b72== Ta5d6ff"Ta5d6ff-cTa5d6ff"Tb4b4b4:
Tff7b72return Te6edf3sysTff7b72.Td2a8ffargvTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Tb4b4b4:T79c0ff30Tb4b4b4] Tff7b72+ Ta5d6ff"Ta5d6ff...Ta5d6ff"
Tff7b72if Te6edf3prog_name Tff7b72== Ta5d6ff"Ta5d6ff-mTa5d6ff"Tb4b4b4:
Te6edf3prog_name Tff7b72= Te6edf3sysTff7b72.Td2a8ffargvTb4b4b4[T79c0ff1Tb4b4b4]
T8b949e# Usually even with -m, sys.argv[0] will already be a path,
T8b949e# so do the following outside the above check
Te6edf3main_str Tff7b72= Ta5d6ff"Ta5d6ff/__main__.pyTa5d6ff"
Tff7b72if Te6edf3prog_nameTff7b72.Td2a8ffendswithTb4b4b4(Te6edf3main_strTb4b4b4)Tb4b4b4:
Te6edf3prog_name Tff7b72= Te6edf3prog_nameTb4b4b4[Tb4b4b4:Tff7b72-Tffa657lenTb4b4b4(Te6edf3main_strTb4b4b4)Tb4b4b4]
T8b949e# Not handled: sys.argv[0] == "-"
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffbasenameTb4b4b4(Te6edf3prog_nameTb4b4b4)

Tff7b72def Td2a8ff_shutdownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3operation Tff7b72= Tff7b72selfTff7b72.Td2a8ff_pa_context_drainTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_block_operationTb4b4b4(Te6edf3operationTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pa_context_disconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pa_context_unrefTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4)
T8b949e# no more mainloop locking necessary from here on:
Te6edf3_paTff7b72.Td2a8ffpa_threaded_mainloop_stopTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmainloopTb4b4b4)
Te6edf3_paTff7b72.Td2a8ffpa_threaded_mainloop_freeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmainloopTb4b4b4)

Tff7b72def Td2a8ff_block_operationTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3operationTb4b4b4)Tb4b4b4:
T8b949e"""Wait until the operation has finished."""
Tff7b72if Te6edf3operation Tff7b72== Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4:
Tff7b72return
Tff7b72while Tff7b72selfTff7b72.Td2a8ff_pa_operation_get_stateTb4b4b4(Te6edf3operationTb4b4b4) Tff7b72== Te6edf3_paTff7b72.Td2a8ffPA_OPERATION_RUNNINGTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffnameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Return application name stored in client proplist"""
Te6edf3idx Tff7b72= Tff7b72selfTff7b72.Td2a8ff_pa_context_get_indexTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4)
Tff7b72if Te6edf3idx Tff7b72< T79c0ff0Tb4b4b4: T8b949e# PA_INVALID_INDEX == -1
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffCould not get client index of PulseAudio context.Ta5d6ff"Tb4b4b4)
Te6edf3name Tff7b72= Tff7b72None
Tf0883e@_ffiTff7b72.Td2a8ffcallbackTb4b4b4(Ta5d6ff"Ta5d6ffpa_client_info_cb_tTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffcallbackTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3client_infoTb4b4b4, Te6edf3eolTb4b4b4, Te6edf3userdataTb4b4b4)Tb4b4b4:
Tff7b72nonlocal Te6edf3name
Tff7b72if Tff7b72not Te6edf3eolTb4b4b4:
Te6edf3name Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3client_infoTff7b72.Td2a8ffnameTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pa_context_get_client_infoTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4, Te6edf3idxTb4b4b4, Te6edf3callbackTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Tff7b72assert Te6edf3name Tff7b72is Tff7b72not Tff7b72None
Tff7b72return Te6edf3name

Tf0883e@nameTff7b72.Td2a8ffsetter
Tff7b72def Td2a8ffnameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4:
Te6edf3rv Tff7b72= Tff7b72None
Tf0883e@_ffiTff7b72.Td2a8ffcallbackTb4b4b4(Ta5d6ff"Ta5d6ffpa_context_success_cb_tTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffcallbackTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3successTb4b4b4, Te6edf3userdataTb4b4b4)Tb4b4b4:
Tff7b72nonlocal Te6edf3rv
Te6edf3rv Tff7b72= Te6edf3success
Tff7b72selfTff7b72.Td2a8ff_pa_context_set_nameTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4, Te6edf3nameTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3callbackTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Tff7b72assert Te6edf3rv Tff7b72is Tff7b72not Tff7b72None
Tff7b72if Te6edf3rv Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffSetting PulseAudio context name failedTa5d6ff"Tb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffsource_listTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Return a list of dicts of information about available sources."""
Te6edf3info Tff7b72= Tb4b4b4[Tb4b4b4]
Tf0883e@_ffiTff7b72.Td2a8ffcallbackTb4b4b4(Ta5d6ff"Ta5d6ffpa_source_info_cb_tTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffcallbackTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3source_infoTb4b4b4, Te6edf3eolTb4b4b4, Te6edf3userdataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3eolTb4b4b4:
Te6edf3infoTff7b72.Td2a8ffappendTb4b4b4(Tffa657dictTb4b4b4(Te6edf3nameTff7b72=Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3source_infoTff7b72.Td2a8ffdescriptionTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tffa657idTff7b72=Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3source_infoTff7b72.Td2a8ffnameTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pa_context_get_source_info_listTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4, Te6edf3callbackTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Tff7b72return Te6edf3info

Tff7b72def Td2a8ffsource_infoTb4b4b4(Tff7b72selfTb4b4b4, Tffa657idTb4b4b4)Tb4b4b4:
T8b949e"""Return a dictionary of information about a specific source."""
Te6edf3info Tff7b72= Tb4b4b4[Tb4b4b4]
Tf0883e@_ffiTff7b72.Td2a8ffcallbackTb4b4b4(Ta5d6ff"Ta5d6ffpa_source_info_cb_tTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffcallbackTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3source_infoTb4b4b4, Te6edf3eolTb4b4b4, Te6edf3userdataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3eolTb4b4b4:
Te6edf3info_dict Tff7b72= Tffa657dictTb4b4b4(Te6edf3latencyTff7b72=Te6edf3source_infoTff7b72.Td2a8fflatencyTb4b4b4,
Te6edf3configured_latencyTff7b72=Te6edf3source_infoTff7b72.Td2a8ffconfigured_latencyTb4b4b4,
Te6edf3channelsTff7b72=Te6edf3source_infoTff7b72.Td2a8ffsample_specTff7b72.Td2a8ffchannelsTb4b4b4,
Te6edf3nameTff7b72=Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3source_infoTff7b72.Td2a8ffdescriptionTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3prop Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffdevice.classTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdevice.apiTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdevice.busTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3_paTff7b72.Td2a8ffpa_proplist_getsTb4b4b4(Te6edf3source_infoTff7b72.Td2a8ffproplistTb4b4b4, Te6edf3propTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3info_dictTb4b4b4[Te6edf3propTb4b4b4] Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3dataTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Tff7b72None
Te6edf3infoTff7b72.Td2a8ffappendTb4b4b4(Te6edf3info_dictTb4b4b4)

Tff7b72selfTff7b72.Td2a8ff_pa_context_get_source_info_by_nameTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4, Tffa657idTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3callbackTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Tff7b72return Te6edf3infoTb4b4b4[T79c0ff0Tb4b4b4]

Tf0883e@property
Tff7b72def Td2a8ffsink_listTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Return a list of dicts of information about available sinks."""
Te6edf3info Tff7b72= Tb4b4b4[Tb4b4b4]
Tf0883e@_ffiTff7b72.Td2a8ffcallbackTb4b4b4(Ta5d6ff"Ta5d6ffpa_sink_info_cb_tTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffcallbackTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3sink_infoTb4b4b4, Te6edf3eolTb4b4b4, Te6edf3userdataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3eolTb4b4b4:
Te6edf3infoTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Tffa657dictTb4b4b4(Te6edf3nameTff7b72=Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3sink_infoTff7b72.Td2a8ffdescriptionTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4,
Tffa657idTff7b72=Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3sink_infoTff7b72.Td2a8ffnameTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pa_context_get_sink_info_listTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4, Te6edf3callbackTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Tff7b72return Te6edf3info

Tff7b72def Td2a8ffsink_infoTb4b4b4(Tff7b72selfTb4b4b4, Tffa657idTb4b4b4)Tb4b4b4:
T8b949e"""Return a dictionary of information about a specific sink."""
Te6edf3info Tff7b72= Tb4b4b4[Tb4b4b4]
Tf0883e@_ffiTff7b72.Td2a8ffcallbackTb4b4b4(Ta5d6ff"Ta5d6ffpa_sink_info_cb_tTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffcallbackTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3sink_infoTb4b4b4, Te6edf3eolTb4b4b4, Te6edf3userdataTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3eolTb4b4b4:
Te6edf3info_dict Tff7b72= Tffa657dictTb4b4b4(Te6edf3latencyTff7b72=Te6edf3sink_infoTff7b72.Td2a8fflatencyTb4b4b4,
Te6edf3configured_latencyTff7b72=Te6edf3sink_infoTff7b72.Td2a8ffconfigured_latencyTb4b4b4,
Te6edf3channelsTff7b72=Te6edf3sink_infoTff7b72.Td2a8ffsample_specTff7b72.Td2a8ffchannelsTb4b4b4,
Te6edf3nameTff7b72=Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3sink_infoTff7b72.Td2a8ffdescriptionTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3prop Tff7b72in Tb4b4b4[Ta5d6ff"Ta5d6ffdevice.classTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdevice.apiTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdevice.busTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3_paTff7b72.Td2a8ffpa_proplist_getsTb4b4b4(Te6edf3sink_infoTff7b72.Td2a8ffproplistTb4b4b4, Te6edf3propTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3info_dictTb4b4b4[Te6edf3propTb4b4b4] Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3dataTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4) Tff7b72if Te6edf3data Tff7b72else Tff7b72None
Te6edf3infoTff7b72.Td2a8ffappendTb4b4b4(Te6edf3info_dictTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pa_context_get_sink_info_by_nameTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4, Tffa657idTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3callbackTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Tff7b72return Te6edf3infoTb4b4b4[T79c0ff0Tb4b4b4]

Tf0883e@property
Tff7b72def Td2a8ffserver_infoTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Return a dictionary of information about the server."""
Te6edf3info Tff7b72= Tb4b4b4{Tb4b4b4}
Tf0883e@_ffiTff7b72.Td2a8ffcallbackTb4b4b4(Ta5d6ff"Ta5d6ffpa_server_info_cb_tTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffcallbackTb4b4b4(Te6edf3contextTb4b4b4, Te6edf3server_infoTb4b4b4, Te6edf3userdataTb4b4b4)Tb4b4b4:
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffserver versionTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3server_infoTff7b72.Td2a8ffserver_versionTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffserver nameTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3server_infoTff7b72.Td2a8ffserver_nameTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdefault sink idTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3server_infoTff7b72.Td2a8ffdefault_sink_nameTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3infoTb4b4b4[Ta5d6ff"Ta5d6ffdefault source idTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffstringTb4b4b4(Te6edf3server_infoTff7b72.Td2a8ffdefault_source_nameTb4b4b4)Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pa_context_get_server_infoTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcontextTb4b4b4, Te6edf3callbackTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Tff7b72return Te6edf3info

Tff7b72def Td2a8ff_lock_mainloopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Context manager for locking the mainloop.

Hold this lock before calling any pulseaudio function while
the mainloop is running.

"""

Tff7b72class T56d364LockTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__enter__Tb4b4b4(Te6edf3self_Tb4b4b4)Tb4b4b4:
Te6edf3_paTff7b72.Td2a8ffpa_threaded_mainloop_lockTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmainloopTb4b4b4)
Tff7b72def Tff7b72__exit__Tb4b4b4(Te6edf3self_Tb4b4b4, Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3tracebackTb4b4b4)Tb4b4b4:
Te6edf3_paTff7b72.Td2a8ffpa_threaded_mainloop_unlockTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmainloopTb4b4b4)
Tff7b72return Te6edf3LockTb4b4b4(Tb4b4b4)

T8b949e# create thread-safe versions of all used pulseaudio functions:
Te6edf3_pa_context_get_source_info_list Tff7b72= Te6edf3_lock_and_blockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_get_source_info_listTb4b4b4)
Te6edf3_pa_context_get_source_info_by_name Tff7b72= Te6edf3_lock_and_blockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_get_source_info_by_nameTb4b4b4)
Te6edf3_pa_context_get_sink_info_list Tff7b72= Te6edf3_lock_and_blockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_get_sink_info_listTb4b4b4)
Te6edf3_pa_context_get_sink_info_by_name Tff7b72= Te6edf3_lock_and_blockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_get_sink_info_by_nameTb4b4b4)
Te6edf3_pa_context_get_client_info Tff7b72= Te6edf3_lock_and_blockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_get_client_infoTb4b4b4)
Te6edf3_pa_context_get_server_info Tff7b72= Te6edf3_lock_and_blockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_get_server_infoTb4b4b4)
Te6edf3_pa_context_get_index Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_get_indexTb4b4b4)
Te6edf3_pa_context_get_state Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_get_stateTb4b4b4)
Te6edf3_pa_context_set_name Tff7b72= Te6edf3_lock_and_blockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_set_nameTb4b4b4)
Te6edf3_pa_context_drain Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_drainTb4b4b4)
Te6edf3_pa_context_disconnect Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_disconnectTb4b4b4)
Te6edf3_pa_context_unref Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_unrefTb4b4b4)
Te6edf3_pa_context_errno Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_context_errnoTb4b4b4)
Te6edf3_pa_operation_get_state Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_operation_get_stateTb4b4b4)
Te6edf3_pa_operation_unref Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_operation_unrefTb4b4b4)
Te6edf3_pa_stream_get_state Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_get_stateTb4b4b4)
Te6edf3_pa_sample_spec_valid Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_sample_spec_validTb4b4b4)
Te6edf3_pa_stream_new Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_newTb4b4b4)
Te6edf3_pa_stream_get_channel_map Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_get_channel_mapTb4b4b4)
Te6edf3_pa_stream_drain Tff7b72= Te6edf3_lock_and_blockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_drainTb4b4b4)
Te6edf3_pa_stream_disconnect Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_disconnectTb4b4b4)
Te6edf3_pa_stream_unref Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_unrefTb4b4b4)
Te6edf3_pa_stream_connect_record Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_connect_recordTb4b4b4)
Te6edf3_pa_stream_readable_size Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_readable_sizeTb4b4b4)
Te6edf3_pa_stream_peek Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_peekTb4b4b4)
Te6edf3_pa_stream_drop Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_dropTb4b4b4)
Te6edf3_pa_stream_connect_playback Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_connect_playbackTb4b4b4)
Te6edf3_pa_stream_update_timing_info Tff7b72= Te6edf3_lock_and_blockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_update_timing_infoTb4b4b4)
Te6edf3_pa_stream_get_latency Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_get_latencyTb4b4b4)
Te6edf3_pa_stream_writable_size Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_writable_sizeTb4b4b4)
Te6edf3_pa_stream_write Tff7b72= Te6edf3_lockTb4b4b4(Te6edf3_paTff7b72.Td2a8ffpa_stream_writeTb4b4b4)
Te6edf3_pa_stream_set_read_callback Tff7b72= Te6edf3_paTff7b72.Td2a8ffpa_stream_set_read_callback

Te6edf3_pulse Tff7b72= Te6edf3_PulseAudioTb4b4b4(Tb4b4b4)
Te6edf3atexitTff7b72.Td2a8ffregisterTb4b4b4(Te6edf3_pulseTff7b72.Td2a8ff_shutdownTb4b4b4)

Tff7b72def Td2a8ffall_speakersTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""A list of all connected speakers.

Returns
-------
speakers : list(_Speaker)

"""
Tff7b72return Tb4b4b4[Te6edf3_SpeakerTb4b4b4(Tffa657idTff7b72=Te6edf3sTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72for Te6edf3s Tff7b72in Te6edf3_pulseTff7b72.Td2a8ffsink_listTb4b4b4]


Tff7b72def Td2a8ffdefault_speakerTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""The default speaker of the system.

Returns
-------
speaker : _Speaker

"""
Te6edf3name Tff7b72= Te6edf3_pulseTff7b72.Td2a8ffserver_infoTb4b4b4[Ta5d6ff"Ta5d6ffdefault sink idTa5d6ff"Tb4b4b4]
Tff7b72return Te6edf3get_speakerTb4b4b4(Te6edf3nameTb4b4b4)


Tff7b72def Td2a8ffget_speakerTb4b4b4(Tffa657idTb4b4b4)Tb4b4b4:
T8b949e"""Get a specific speaker by a variety of means.

Parameters
----------
id : int or str
can be a backend id string (Windows, Linux) or a device id int (MacOS), a substring of the
speaker name, or a fuzzy-matched pattern for the speaker name.

Returns
-------
speaker : _Speaker

"""
Te6edf3speakers Tff7b72= Te6edf3_pulseTff7b72.Td2a8ffsink_list
Tff7b72return Te6edf3_SpeakerTb4b4b4(Tffa657idTff7b72=Te6edf3_match_soundcardTb4b4b4(Tffa657idTb4b4b4, Te6edf3speakersTb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4)


Tff7b72def Td2a8ffall_microphonesTb4b4b4(Te6edf3include_loopbackTff7b72=Tff7b72FalseTb4b4b4, Te6edf3exclude_monitorsTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
T8b949e"""A list of all connected microphones.

By default, this does not include loopbacks (virtual microphones
that record the output of a speaker).

Parameters
----------
include_loopback : bool
allow recording of speaker outputs
exclude_monitors : bool
deprecated version of ``include_loopback``

Returns
-------
microphones : list(_Microphone)

"""

Tff7b72if Tff7b72not Te6edf3exclude_monitorsTb4b4b4:
Te6edf3warningsTff7b72.Td2a8ffwarnTb4b4b4(Ta5d6ff"Ta5d6ffThe exclude_monitors flag is being replaced by the include_loopback flagTa5d6ff"Tb4b4b4, Tf85149DeprecationWarningTb4b4b4)
Te6edf3include_loopback Tff7b72= Tff7b72not Te6edf3exclude_monitors

Te6edf3mics Tff7b72= Tb4b4b4[Te6edf3_MicrophoneTb4b4b4(Tffa657idTff7b72=Te6edf3mTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72for Te6edf3m Tff7b72in Te6edf3_pulseTff7b72.Td2a8ffsource_listTb4b4b4]
Tff7b72if Tff7b72not Te6edf3include_loopbackTb4b4b4:
Tff7b72return Tb4b4b4[Te6edf3m Tff7b72for Te6edf3m Tff7b72in Te6edf3mics Tff7b72if Te6edf3mTff7b72.Td2a8ff_get_infoTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffdevice.classTa5d6ff"Tb4b4b4] Tff7b72!= Ta5d6ff"Ta5d6ffmonitorTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3mics


Tff7b72def Td2a8ffdefault_microphoneTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""The default microphone of the system.

Returns
-------
microphone : _Microphone
"""
Te6edf3name Tff7b72= Te6edf3_pulseTff7b72.Td2a8ffserver_infoTb4b4b4[Ta5d6ff"Ta5d6ffdefault source idTa5d6ff"Tb4b4b4]
Tff7b72return Te6edf3get_microphoneTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3include_loopbackTff7b72=Tff7b72TrueTb4b4b4)


Tff7b72def Td2a8ffget_microphoneTb4b4b4(Tffa657idTb4b4b4, Te6edf3include_loopbackTff7b72=Tff7b72FalseTb4b4b4, Te6edf3exclude_monitorsTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
T8b949e"""Get a specific microphone by a variety of means.

By default, this does not include loopbacks (virtual microphones
that record the output of a speaker).

Parameters
----------
id : int or str
can be a backend id string (Windows, Linux) or a device id int (MacOS), a substring of the
speaker name, or a fuzzy-matched pattern for the speaker name.
include_loopback : bool
allow recording of speaker outputs
exclude_monitors : bool
deprecated version of ``include_loopback``

Returns
-------
microphone : _Microphone
"""

Tff7b72if Tff7b72not Te6edf3exclude_monitorsTb4b4b4:
Te6edf3warningsTff7b72.Td2a8ffwarnTb4b4b4(Ta5d6ff"Ta5d6ffThe exclude_monitors flag is being replaced by the include_loopback flagTa5d6ff"Tb4b4b4, Tf85149DeprecationWarningTb4b4b4)
Te6edf3include_loopback Tff7b72= Tff7b72not Te6edf3exclude_monitors

Te6edf3microphones Tff7b72= Te6edf3_pulseTff7b72.Td2a8ffsource_list
Tff7b72return Te6edf3_MicrophoneTb4b4b4(Tffa657idTff7b72=Te6edf3_match_soundcardTb4b4b4(Tffa657idTb4b4b4, Te6edf3microphonesTb4b4b4, Te6edf3include_loopbackTb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4)


Tff7b72def Td2a8ff_match_soundcardTb4b4b4(Tffa657idTb4b4b4, Te6edf3soundcardsTb4b4b4, Te6edf3include_loopbackTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
T8b949e"""Find id in a list of soundcards.

id can be a pulseaudio id, a substring of the microphone name, or
a fuzzy-matched pattern for the microphone name.
"""
Tff7b72if Tff7b72not Te6edf3include_loopbackTb4b4b4:
Te6edf3soundcards_by_id Tff7b72= Tb4b4b4{Te6edf3soundcardTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4: Te6edf3soundcard Tff7b72for Te6edf3soundcard Tff7b72in Te6edf3soundcards
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmonitorTa5d6ff" Tff7b72in Te6edf3soundcardTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4}
Te6edf3soundcards_by_name Tff7b72= Tb4b4b4{Te6edf3soundcardTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4: Te6edf3soundcard Tff7b72for Te6edf3soundcard Tff7b72in Te6edf3soundcards
Tff7b72if Tff7b72not Ta5d6ff"Ta5d6ffmonitorTa5d6ff" Tff7b72in Te6edf3soundcardTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4}
Tff7b72elseTb4b4b4:
Te6edf3soundcards_by_id Tff7b72= Tb4b4b4{Te6edf3soundcardTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]Tb4b4b4: Te6edf3soundcard Tff7b72for Te6edf3soundcard Tff7b72in Te6edf3soundcardsTb4b4b4}
Te6edf3soundcards_by_name Tff7b72= Tb4b4b4{Te6edf3soundcardTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4: Te6edf3soundcard Tff7b72for Te6edf3soundcard Tff7b72in Te6edf3soundcardsTb4b4b4}
Tff7b72if Tffa657id Tff7b72in Te6edf3soundcards_by_idTb4b4b4:
Tff7b72return Te6edf3soundcards_by_idTb4b4b4[Tffa657idTb4b4b4]
T8b949e# try substring match:
Tff7b72for Te6edf3nameTb4b4b4, Te6edf3soundcard Tff7b72in Te6edf3soundcards_by_nameTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657id Tff7b72in Te6edf3nameTb4b4b4:
Tff7b72return Te6edf3soundcard
T8b949e# try fuzzy match:
Te6edf3pattern Tff7b72= Ta5d6ff"Ta5d6ff.*Ta5d6ff"Tff7b72.Td2a8ffjoinTb4b4b4(Tffa657idTb4b4b4)
Tff7b72for Te6edf3nameTb4b4b4, Te6edf3soundcard Tff7b72in Te6edf3soundcards_by_nameTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3reTff7b72.Td2a8ffmatchTb4b4b4(Te6edf3patternTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3soundcard
Tff7b72raise Tf85149IndexErrorTb4b4b4(Ta5d6ff"Ta5d6ffno soundcard with id Tffd700{}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657idTb4b4b4)Tb4b4b4)


Tff7b72def Td2a8ffget_nameTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e"""Get application name.

.. note::
Currently only works on Linux.

Returns
-------
name : str
"""
Tff7b72return Te6edf3_pulseTff7b72.Td2a8ffname


Tff7b72def Td2a8ffset_nameTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4:
T8b949e"""Set application name.

.. note::
Currently only works on Linux.

Parameters
----------
name : str
The application using the soundcard
will be identified by the OS using this name.
"""
Te6edf3_pulseTff7b72.Td2a8ffname Tff7b72= Te6edf3name


Tff7b72class T56d364_SoundCardTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Tb4b4b4, Tffa657idTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_id Tff7b72= Tffa657id

Tf0883e@property
Tff7b72def Td2a8ffchannelsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""int or list(int): Either the number of channels, or a list of
channel indices. Index -1 is the mono mixture of all channels,
and subsequent numbers are channel numbers (left, right,
center, ...)

"""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_get_infoTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffchannelsTa5d6ff"Tb4b4b4]

Tf0883e@property
Tff7b72def Td2a8ffidTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""object: A backend-dependent unique ID."""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_id

Tf0883e@property
Tff7b72def Td2a8ffnameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""str: The human-readable name of the soundcard."""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_get_infoTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]

Tff7b72def Td2a8ff_get_infoTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3_pulseTff7b72.Td2a8ffsource_infoTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4)


Tff7b72class T56d364_SpeakerTb4b4b4(Te6edf3_SoundCardTb4b4b4)Tb4b4b4:
T8b949e"""A soundcard output. Can be used to play audio.

Use the :func:`play` method to play one piece of audio, or use the
:func:`player` method to get a context manager for playing continuous
audio.

Multiple calls to :func:`play` play immediately and concurrently,
while the :func:`player` schedules multiple pieces of audio one
after another.

"""

Tff7b72def Tff7b72__repr__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<Speaker Tffd700{}Ta5d6ff (Tffd700{}Ta5d6ff channels)>Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)

Tff7b72def Td2a8ffplayerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTff7b72=Tff7b72NoneTb4b4b4, Te6edf3blocksizeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Create Player for playing audio.

Parameters
----------
samplerate : int
The desired sampling rate in Hz
channels : {int, list(int)}, optional
Play on these channels. For example, ``[0, 3]`` will play
stereo data on the physical channels one and four.
Defaults to use all available channels.
On Linux, channel ``-1`` is the mono mix of all channels.
On macOS, channel ``-1`` is silence.
blocksize : int
Will play this many samples at a time. Choose a lower
block size for lower latency and more CPU usage.
exclusive_mode : bool, optional
Windows only: open sound card in exclusive mode, which
might be necessary for short block lengths or high
sample rates or optimal performance. Default is ``False``.

Returns
-------
player : _Player
"""
Tff7b72if Te6edf3channels Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3channels Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72return Te6edf3_PlayerTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3blocksizeTb4b4b4)

Tff7b72def Td2a8ffplayTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTff7b72=Tff7b72NoneTb4b4b4, Te6edf3blocksizeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Play some audio data.

Parameters
----------
data : numpy array
The audio data to play. Must be a *frames x channels* Numpy array.
samplerate : int
The desired sampling rate in Hz
channels : {int, list(int)}, optional
Play on these channels. For example, ``[0, 3]`` will play
stereo data on the physical channels one and four.
Defaults to use all available channels.
On Linux, channel ``-1`` is the mono mix of all channels.
On macOS, channel ``-1`` is silence.
blocksize : int
Will play this many samples at a time. Choose a lower
block size for lower latency and more CPU usage.
"""
Tff7b72if Te6edf3channels Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3channels Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72with Te6edf3_PlayerTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3blocksizeTb4b4b4) Tff7b72as Te6edf3sTb4b4b4:
Te6edf3sTff7b72.Td2a8ffplayTb4b4b4(Te6edf3dataTb4b4b4)

Tff7b72def Td2a8ff_get_infoTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3_pulseTff7b72.Td2a8ffsink_infoTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4)


Tff7b72class T56d364_MicrophoneTb4b4b4(Te6edf3_SoundCardTb4b4b4)Tb4b4b4:
T8b949e"""A soundcard input. Can be used to record audio.

Use the :func:`record` method to record one piece of audio, or use
the :func:`recorder` method to get a context manager for recording
continuous audio.

Multiple calls to :func:`record` record immediately and
concurrently, while the :func:`recorder` schedules multiple pieces
of audio to be recorded one after another.

"""

Tff7b72def Tff7b72__repr__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffisloopbackTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<Loopback Tffd700{}Ta5d6ff (Tffd700{}Ta5d6ff channels)>Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff<Microphone Tffd700{}Ta5d6ff (Tffd700{}Ta5d6ff channels)>Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)

Tf0883e@property
Tff7b72def Td2a8ffisloopbackTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""bool : Whether this microphone is recording a speaker."""
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_get_infoTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffdevice.classTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffmonitorTa5d6ff"

Tff7b72def Td2a8ffrecorderTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTff7b72=Tff7b72NoneTb4b4b4, Te6edf3blocksizeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Create Recorder for recording audio.

Parameters
----------
samplerate : int
The desired sampling rate in Hz
channels : {int, list(int)}, optional
Record on these channels. For example, ``[0, 3]`` will record
stereo data from the physical channels one and four.
Defaults to use all available channels.
On Linux, channel ``-1`` is the mono mix of all channels.
On macOS, channel ``-1`` is silence.
blocksize : int
Will record this many samples at a time. Choose a lower
block size for lower latency and more CPU usage.
exclusive_mode : bool, optional
Windows only: open sound card in exclusive mode, which
might be necessary for short block lengths or high
sample rates or optimal performance. Default is ``False``.

Returns
-------
recorder : _Recorder
"""
Tff7b72if Te6edf3channels Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3channels Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72return Te6edf3_RecorderTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3blocksizeTb4b4b4)

Tff7b72def Td2a8ffrecordTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3numframesTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTff7b72=Tff7b72NoneTb4b4b4, Te6edf3blocksizeTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Record some audio data.

Parameters
----------
numframes: int
The number of frames to record.
samplerate : int
The desired sampling rate in Hz
channels : {int, list(int)}, optional
Record on these channels. For example, ``[0, 3]`` will record
stereo data from the physical channels one and four.
Defaults to use all available channels.
On Linux, channel ``-1`` is the mono mix of all channels.
On macOS, channel ``-1`` is silence.
blocksize : int
Will record this many samples at a time. Choose a lower
block size for lower latency and more CPU usage.

Returns
-------
data : numpy array
The recorded audio data. Will be a *frames x channels* Numpy array.
"""
Tff7b72if Te6edf3channels Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3channels Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72with Te6edf3_RecorderTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_idTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3blocksizeTb4b4b4) Tff7b72as Te6edf3rTb4b4b4:
Tff7b72return Te6edf3rTff7b72.Td2a8ffrecordTb4b4b4(Te6edf3numframesTb4b4b4)


Tff7b72class T56d364_StreamTb4b4b4:
T8b949e"""A context manager for an active audio stream.

This class is meant to be subclassed. Children must implement the
`_connect_stream` method which takes a `pa_buffer_attr*` struct,
and connects an appropriate stream.

This context manager can only be entered once, and can not be used
after it is closed.

"""

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tffa657idTb4b4b4, Te6edf3samplerateTb4b4b4, Te6edf3channelsTb4b4b4, Te6edf3blocksizeTff7b72=Tff7b72NoneTb4b4b4, Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffoutputstreamTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_id Tff7b72= Tffa657id
Tff7b72selfTff7b72.Td2a8ff_samplerate Tff7b72= Te6edf3samplerate
Tff7b72selfTff7b72.Td2a8ff_name Tff7b72= Te6edf3name
Tff7b72selfTff7b72.Td2a8ff_blocksize Tff7b72= Te6edf3blocksize
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Te6edf3channels

Tff7b72def Tff7b72__enter__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3samplespec Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffnewTb4b4b4(Ta5d6ff"Ta5d6ffpa_sample_spec*Ta5d6ff"Tb4b4b4)
Te6edf3samplespecTff7b72.Td2a8ffformat Tff7b72= Te6edf3_paTff7b72.Td2a8ffPA_SAMPLE_FLOAT32LE
Te6edf3samplespecTff7b72.Td2a8ffrate Tff7b72= Tff7b72selfTff7b72.Td2a8ff_samplerate
Tff7b72if Tffa657isinstanceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4, Te6edf3collectionsTff7b72.Td2a8ffabcTff7b72.Td2a8ffIterableTb4b4b4)Tb4b4b4:
Te6edf3samplespecTff7b72.Td2a8ffchannels Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Tff7b72elif Tffa657isinstanceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4, Tffa657intTb4b4b4)Tb4b4b4:
Te6edf3samplespecTff7b72.Td2a8ffchannels Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72elseTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffchannels must be iterable or integerTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3_pulseTff7b72.Td2a8ff_pa_sample_spec_validTb4b4b4(Te6edf3samplespecTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid sample specTa5d6ff"Tb4b4b4)

T8b949e# pam and channelmap refer to the same object, but need different
T8b949e# names to avoid garbage collection trouble on the Python/C boundary
Te6edf3pam Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffnewTb4b4b4(Ta5d6ff"Ta5d6ffpa_channel_map*Ta5d6ff"Tb4b4b4)
Te6edf3channelmap Tff7b72= Te6edf3_paTff7b72.Td2a8ffpa_channel_map_init_extendTb4b4b4(Te6edf3pamTb4b4b4, Te6edf3samplespecTff7b72.Td2a8ffchannelsTb4b4b4, Te6edf3_paTff7b72.Td2a8ffPA_CHANNEL_MAP_DEFAULTTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4, Te6edf3collectionsTff7b72.Td2a8ffabcTff7b72.Td2a8ffIterableTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3idxTb4b4b4, Te6edf3ch Tff7b72in Tffa657enumerateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3chTb4b4b4, Tffa657intTb4b4b4)Tb4b4b4:
Te6edf3channelmapTff7b72.Td2a8ffmapTb4b4b4[Te6edf3idxTb4b4b4] Tff7b72= Te6edf3ch Tff7b72+ T79c0ff1
Tff7b72elseTb4b4b4:
Te6edf3channel_name_to_index Tff7b72= Te6edf3channel_name_mapTb4b4b4(Tb4b4b4)
Te6edf3channelmapTff7b72.Td2a8ffmapTb4b4b4[Te6edf3idxTb4b4b4] Tff7b72= Te6edf3channel_name_to_indexTb4b4b4[Te6edf3chTb4b4b4] Tff7b72+ T79c0ff1

Tff7b72if Tff7b72not Te6edf3_paTff7b72.Td2a8ffpa_channel_map_validTb4b4b4(Te6edf3channelmapTb4b4b4)Tb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvalid channel mapTa5d6ff"Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffstream Tff7b72= Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_newTb4b4b4(Te6edf3_pulseTff7b72.Td2a8ffcontextTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_nameTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3samplespecTb4b4b4, Te6edf3channelmapTb4b4b4)
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4:
Te6edf3errno Tff7b72= Te6edf3_pulseTff7b72.Td2a8ff_pa_context_errnoTb4b4b4(Te6edf3_pulseTff7b72.Td2a8ffcontextTb4b4b4)
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffstream creation failed with error Ta5d6ff"Tb4b4b4, Te6edf3errnoTb4b4b4)
Te6edf3bufattr Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffnewTb4b4b4(Ta5d6ff"Ta5d6ffpa_buffer_attr*Ta5d6ff"Tb4b4b4)
Te6edf3bufattrTff7b72.Td2a8ffmaxlength Tff7b72= T79c0ff2Tff7b72*Tff7b72*T79c0ff32Tff7b72-T79c0ff1 T8b949e# max buffer length
Te6edf3numchannels Tff7b72= Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72if Tffa657isinstanceTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4, Tffa657intTb4b4b4) Tff7b72else Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Te6edf3bufattrTff7b72.Td2a8fffragsize Tff7b72= Tff7b72selfTff7b72.Td2a8ff_blocksizeTff7b72*Te6edf3numchannelsTff7b72*T79c0ff4 Tff7b72if Tff7b72selfTff7b72.Td2a8ff_blocksize Tff7b72else T79c0ff2Tff7b72*Tff7b72*T79c0ff32Tff7b72-T79c0ff1 T8b949e# recording block sys.getsizeof()
Te6edf3bufattrTff7b72.Td2a8ffminreq Tff7b72= T79c0ff2Tff7b72*Tff7b72*T79c0ff32Tff7b72-T79c0ff1 T8b949e# start requesting more data at this bytes
Te6edf3bufattrTff7b72.Td2a8ffprebuf Tff7b72= T79c0ff2Tff7b72*Tff7b72*T79c0ff32Tff7b72-T79c0ff1 T8b949e# start playback after this bytes are available
Te6edf3bufattrTff7b72.Td2a8fftlength Tff7b72= Tff7b72selfTff7b72.Td2a8ff_blocksizeTff7b72*Te6edf3numchannelsTff7b72*T79c0ff4 Tff7b72if Tff7b72selfTff7b72.Td2a8ff_blocksize Tff7b72else T79c0ff2Tff7b72*Tff7b72*T79c0ff32Tff7b72-T79c0ff1 T8b949e# buffer length in bytes on server
Tff7b72selfTff7b72.Td2a8ff_connect_streamTb4b4b4(Te6edf3bufattrTb4b4b4)
Tff7b72while Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_get_stateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4) Tff7b72not Tff7b72in Tb4b4b4[Te6edf3_paTff7b72.Td2a8ffPA_STREAM_READYTb4b4b4, Te6edf3_paTff7b72.Td2a8ffPA_STREAM_FAILEDTb4b4b4]Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)
Tff7b72if Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_get_stateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4) Tff7b72== Te6edf3_paTff7b72.Td2a8ffPA_STREAM_FAILEDTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffStream creation failed. Stream is in status Tffd700{}Ta5d6ff"
Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_get_stateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3channel_map Tff7b72= Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_get_channel_mapTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Tffa657intTb4b4b4(Te6edf3channel_mapTff7b72.Td2a8ffchannelsTb4b4b4)
Tff7b72return Tff7b72self

Tff7b72def Tff7b72__exit__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3exc_typeTb4b4b4, Te6edf3exc_valueTb4b4b4, Te6edf3tracebackTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3_PlayerTb4b4b4)Tb4b4b4: T8b949e# only playback streams need to drain
Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_drainTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_disconnectTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4)
Tff7b72while Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_get_stateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4) Tff7b72not Tff7b72in Tb4b4b4(Te6edf3_paTff7b72.Td2a8ffPA_STREAM_TERMINATEDTb4b4b4, Te6edf3_paTff7b72.Td2a8ffPA_STREAM_FAILEDTb4b4b4)Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.01Tb4b4b4)
Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_unrefTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4)

Tf0883e@property
Tff7b72def Td2a8fflatencyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""float : Latency of the stream in seconds (only available on Linux)"""
Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_update_timing_infoTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Te6edf3microseconds Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffnewTb4b4b4(Ta5d6ff"Ta5d6ffpa_usec_t*Ta5d6ff"Tb4b4b4)
Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_get_latencyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4, Te6edf3microsecondsTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)
Tff7b72return Te6edf3microsecondsTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72/ T79c0ff1000000 T8b949e# 1_000_000 (3.5 compat)


Tff7b72class T56d364_PlayerTb4b4b4(Te6edf3_StreamTb4b4b4)Tb4b4b4:
T8b949e"""A context manager for an active output stream.

Audio playback is available as soon as the context manager is
entered. Audio data can be played using the :func:`play` method.
Successive calls to :func:`play` will queue up the audio one piece
after another. If no audio is queued up, this will play silence.

This context manager can only be entered once, and can not be used
after it is closed.

"""

Tff7b72def Td2a8ff_connect_streamTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bufattrTb4b4b4)Tb4b4b4:
Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_connect_playbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_idTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3bufattrTb4b4b4, Te6edf3_paTff7b72.Td2a8ffPA_STREAM_ADJUST_LATENCYTb4b4b4,
Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)

Tff7b72def Td2a8ffplayTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
T8b949e"""Play some audio data.

Internally, all data is handled as ``float32`` and with the
appropriate number of channels. For maximum performance,
provide data as a *frames × channels* float32 numpy array.

If single-channel or one-dimensional data is given, this data
will be played on all available channels.

This function will return *before* all data has been played,
so that additional data can be provided for gapless playback.
The amount of buffering can be controlled through the
blocksize of the player object.

If data is provided faster than it is played, later pieces
will be queued up and played one after another.

Parameters
----------
data : numpy array
The audio data to play. Must be a *frames x channels* Numpy array.

"""

Te6edf3data Tff7b72= Te6edf3numpyTff7b72.Td2a8ffarrayTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3dtypeTff7b72=Ta5d6ff"Ta5d6fffloat32Ta5d6ff"Tb4b4b4, Te6edf3orderTff7b72=Ta5d6ff"Ta5d6ffCTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3dataTff7b72.Td2a8ffndim Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3dataTb4b4b4[Tb4b4b4:Tb4b4b4, Tff7b72NoneTb4b4b4] T8b949e# force 2d
Tff7b72if Te6edf3dataTff7b72.Td2a8ffndim Tff7b72!= T79c0ff2Tb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffdata must be 1d or 2d, not Tffd700{}Ta5d6ffdTa5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3dataTff7b72.Td2a8ffndimTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3dataTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72== T79c0ff1 Tff7b72and Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72!= T79c0ff1Tb4b4b4:
Te6edf3data Tff7b72= Te6edf3numpyTff7b72.Td2a8fftileTb4b4b4(Te6edf3dataTb4b4b4, Tb4b4b4[T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3dataTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72!= Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4:
Tff7b72raise Tf85149TypeErrorTb4b4b4(Ta5d6ff"Ta5d6ffsecond dimension of data must be equal to the number of channels, not Tffd700{}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3dataTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72while Te6edf3dataTff7b72.Td2a8ffnbytes Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3nwrite Tff7b72= Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_writable_sizeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4) Tff7b72/Tff7b72/ Tb4b4b4(T79c0ff4 Tff7b72* Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4) T8b949e# 4 bytes per sample

Tff7b72if Te6edf3nwrite Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.001Tb4b4b4)
Tff7b72continue
Tffa657bytes Tff7b72= Te6edf3dataTb4b4b4[Tb4b4b4:Te6edf3nwriteTb4b4b4]Tff7b72.Td2a8ffravelTb4b4b4(Tb4b4b4)Tff7b72.Td2a8fftobytesTb4b4b4(Tb4b4b4)
Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_writeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4, Tffa657bytesTb4b4b4, Tffa657lenTb4b4b4(Tffa657bytesTb4b4b4)Tb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3_paTff7b72.Td2a8ffPA_SEEK_RELATIVETb4b4b4)
Te6edf3data Tff7b72= Te6edf3dataTb4b4b4[Te6edf3nwriteTb4b4b4:Tb4b4b4]

Tff7b72class T56d364_RecorderTb4b4b4(Te6edf3_StreamTb4b4b4)Tb4b4b4:
T8b949e"""A context manager for an active input stream.

Audio recording is available as soon as the context manager is
entered. Recorded audio data can be read using the :func:`record`
method. If no audio data is available, :func:`record` will block until
the requested amount of audio data has been recorded.

This context manager can only be entered once, and can not be used
after it is closed.

"""

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Te6edf3_RecorderTb4b4b4, Tff7b72selfTb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pending_chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8ffzerosTb4b4b4(Tb4b4b4(T79c0ff0Tb4b4b4, Tb4b4b4)Tb4b4b4, Te6edf3dtypeTff7b72=Ta5d6ff"Ta5d6fffloat32Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_record_event Tff7b72= Te6edf3threadingTff7b72.Td2a8ffEventTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ff_connect_streamTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3bufattrTb4b4b4)Tb4b4b4:
Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_connect_recordTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_idTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3bufattrTb4b4b4, Te6edf3_paTff7b72.Td2a8ffPA_STREAM_ADJUST_LATENCYTb4b4b4)
Tf0883e@_ffiTff7b72.Td2a8ffcallbackTb4b4b4(Ta5d6ff"Ta5d6ffpa_stream_request_cb_tTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffread_callbackTb4b4b4(Te6edf3streamTb4b4b4, Te6edf3nbytesTb4b4b4, Te6edf3userdataTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_record_eventTff7b72.Td2a8ffsetTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_callback Tff7b72= Te6edf3read_callback
Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_set_read_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4, Te6edf3read_callbackTb4b4b4, Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4)

Tff7b72def Td2a8ff_record_chunkTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e'''Record one chunk of audio data, as returned by pulseaudio

The data will be returned as a 1D numpy array, which will be used by
the `record` method. This function is the interface of the `_Recorder`
object with pulseaudio
'''
Te6edf3data_ptr Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffnewTb4b4b4(Ta5d6ff"Ta5d6ffvoid**Ta5d6ff"Tb4b4b4)
Te6edf3nbytes_ptr Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffnewTb4b4b4(Ta5d6ff"Ta5d6ffsize_t*Ta5d6ff"Tb4b4b4)
Te6edf3readable_bytes Tff7b72= Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_readable_sizeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4)
Tff7b72while Tff7b72not Te6edf3readable_bytesTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_record_eventTff7b72.Td2a8ffwaitTb4b4b4(Te6edf3timeoutTff7b72=T79c0ff1Tb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_get_stateTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4) Tff7b72== Te6edf3_paTff7b72.Td2a8ffPA_STREAM_FAILEDTb4b4b4:
Tff7b72raise Tf85149RuntimeErrorTb4b4b4(Ta5d6ff"Ta5d6ffRecording failed, stream is in status FAILEDTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_record_eventTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Te6edf3readable_bytes Tff7b72= Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_readable_sizeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4)
Te6edf3data_ptrTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffNULL
Te6edf3nbytes_ptrTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0
Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_peekTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4, Te6edf3data_ptrTb4b4b4, Te6edf3nbytes_ptrTb4b4b4)
Tff7b72if Te6edf3data_ptrTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72!= Te6edf3_ffiTff7b72.Td2a8ffNULLTb4b4b4:
Te6edf3buffer Tff7b72= Te6edf3_ffiTff7b72.Td2a8ffbufferTb4b4b4(Te6edf3data_ptrTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3nbytes_ptrTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Te6edf3chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8fffrombufferTb4b4b4(Te6edf3bufferTb4b4b4, Te6edf3dtypeTff7b72=Ta5d6ff"Ta5d6fffloat32Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3data_ptrTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3_ffiTff7b72.Td2a8ffNULL Tff7b72and Te6edf3nbytes_ptrTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72!= T79c0ff0Tb4b4b4:
Te6edf3chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8ffzerosTb4b4b4(Te6edf3nbytes_ptrTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72/Tff7b72/T79c0ff4Tb4b4b4, Te6edf3dtypeTff7b72=Ta5d6ff"Ta5d6fffloat32Ta5d6ff"Tb4b4b4)
Tff7b72if Te6edf3nbytes_ptrTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3_pulseTff7b72.Td2a8ff_pa_stream_dropTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstreamTb4b4b4)
Tff7b72return Te6edf3chunk

Tff7b72def Td2a8ffrecordTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3numframesTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Record a block of audio data.

The data will be returned as a *frames × channels* float32
numpy array. This function will wait until ``numframes``
frames have been recorded. If numframes is given, it will
return exactly ``numframes`` frames, and buffer the rest for
later.

If ``numframes`` is None, it will return whatever the audio
backend has available right now. Use this if latency must be
kept to a minimum, but be aware that block sizes can change at
the whims of the audio backend.

If using :func:`record` with ``numframes=None`` after using
:func:`record` with a required ``numframes``, the last
buffered frame will be returned along with the new recorded
block. (If you want to empty the last buffered frame instead,
use :func:`flush`)

Parameters
----------
numframes : int, optional
The number of frames to record.

Returns
-------
data : numpy array
The recorded audio data. Will be a *frames x channels* Numpy array.

"""
Tff7b72if Te6edf3numframes Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3numpyTff7b72.Td2a8ffreshapeTb4b4b4(Te6edf3numpyTff7b72.Td2a8ffconcatenateTb4b4b4(Tb4b4b4[Tff7b72selfTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffravelTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_record_chunkTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)Tb4b4b4,
Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3captured_data Tff7b72= Tb4b4b4[Tff7b72selfTff7b72.Td2a8ff_pending_chunkTb4b4b4]
Te6edf3captured_frames Tff7b72= Tff7b72selfTff7b72.Td2a8ff_pending_chunkTff7b72.Td2a8ffshapeTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72/ Tff7b72selfTff7b72.Td2a8ffchannels
Tff7b72if Te6edf3captured_frames Tff7b72>Tff7b72= Te6edf3numframesTb4b4b4:
Te6edf3keepTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_pending_chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8ffsplitTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_pending_chunkTb4b4b4,
Tb4b4b4[Tffa657intTb4b4b4(Te6edf3numframes Tff7b72* Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)Tb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3numpyTff7b72.Td2a8ffreshapeTb4b4b4(Te6edf3keepTb4b4b4, Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72while Te6edf3captured_frames Tff7b72< Te6edf3numframesTb4b4b4:
Te6edf3chunk Tff7b72= Tff7b72selfTff7b72.Td2a8ff_record_chunkTb4b4b4(Tb4b4b4)
Te6edf3captured_dataTff7b72.Td2a8ffappendTb4b4b4(Te6edf3chunkTb4b4b4)
Te6edf3captured_frames Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4)Tff7b72/Tff7b72selfTff7b72.Td2a8ffchannels
Te6edf3to_split Tff7b72= Tffa657intTb4b4b4(Tffa657lenTb4b4b4(Te6edf3chunkTb4b4b4) Tff7b72- Tb4b4b4(Te6edf3captured_frames Tff7b72- Te6edf3numframesTb4b4b4) Tff7b72* Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4)
Te6edf3captured_dataTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_pending_chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8ffsplitTb4b4b4(Te6edf3captured_dataTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4, Tb4b4b4[Te6edf3to_splitTb4b4b4]Tb4b4b4)
Tff7b72return Te6edf3numpyTff7b72.Td2a8ffreshapeTb4b4b4(Te6edf3numpyTff7b72.Td2a8ffconcatenateTb4b4b4(Te6edf3captured_dataTb4b4b4)Tb4b4b4, Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]Tb4b4b4)

Tff7b72def Td2a8ffflushTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Return the last pending chunk.

After using the :func:`record` method, this will return the
last incomplete chunk and delete it.

Returns
-------
data : numpy array
The recorded audio data. Will be a *frames x channels* Numpy array.

"""
Te6edf3last_chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8ffreshapeTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_pending_chunkTb4b4b4, Tb4b4b4[Tff7b72-T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffchannelsTb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_pending_chunk Tff7b72= Te6edf3numpyTff7b72.Td2a8ffzerosTb4b4b4(Tb4b4b4(T79c0ff0Tb4b4b4, Tb4b4b4)Tb4b4b4, Te6edf3dtypeTff7b72=Ta5d6ff"Ta5d6fffloat32Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3last_chunk


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────